﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using TccServicos.Models;
using TccServicos.Util;

namespace TccServicos.Controllers
{
    public class ChamadaChamadaController : ApiController
    {
        #region Atributos
        private string sThread = "";
        #endregion

        #region WebApis Topicos Avancados Chamada Chamada
        [HttpPost]
        public RetornoServico SaveChamadaChamada(ChamadaChamada chamada)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "SaveChamadaChamada", sThread);

            try
            {
                if (!Validacao.ObjetoValido(chamada))
                {
                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.objetoInvalido));
                }

                string jsonEntrada = JsonConvert.SerializeObject(chamada, new JsonSerializerSettings()
                {
                    NullValueHandling = NullValueHandling.Ignore
                });

                Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, jsonEntrada));

                using (adoteEntitiesTAADS contexto = new adoteEntitiesTAADS())
                {
                    DateTime data = DateTime.MinValue;
                    DateTime.TryParse(chamada.data, out data);

                    var inclusao = new CHAMADA_CHAMADA
                    {
                        MATRICULA = chamada.matricula,
                        TURMA = chamada.turma,
                        DATA = data,
                    };

                    var consultaJaExiste = (from t in contexto.CHAMADA_CHAMADA.AsNoTracking()
                                            where t.MATRICULA.Equals(chamada.matricula)
                                               && t.TURMA.Equals(chamada.turma)
                                               && t.DATA.Equals(data)
                                            select t.ID_CHAMADA).FirstOrDefault();
                    if (consultaJaExiste > 0)
                    {
                        Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.salvoComSucesso));
                        return new RetornoServico()
                            {
                                status = 2,
                                mensagem = "Chamada já realizada!",
                            };
                    }
                    else
                    {
                        contexto.CHAMADA_CHAMADA.Add(inclusao);
                        contexto.SaveChanges();
                        Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.salvoComSucesso));
                        return Util.Util.RetornoOk(inclusao.ID_CHAMADA);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return Util.Util.RetornoErro(ex.ToString());
            }
        }

        [HttpGet]
        public List<ChamadaChamada> GetChamadaChamada([FromUri] string data = null)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "GetChamadaChamada", sThread);

            try
            {
                Log.GravarLog(string.Format("{0}: data={1}", nomeFuncao, !string.IsNullOrEmpty(data) ? data : ""));

                using (adoteEntitiesTAADS contexto = new adoteEntitiesTAADS())
                {
                    var consulta = (from t in contexto.CHAMADA_CHAMADA.AsNoTracking()
                                    join n in contexto.CHAMADA_CADASTRO.AsNoTracking() on t.MATRICULA equals n.MATRICULA
                                    into ljn from n in ljn.DefaultIfEmpty()
                                    select new ChamadaChamada
                                    {
                                        idChamada = t.ID_CHAMADA,
                                        matricula = t.MATRICULA,
                                        turma = t.TURMA,
                                        dataBD = t.DATA,
                                        nome = n.NOME,
                                    });
                    if (!string.IsNullOrEmpty(data))
                    {
                        DateTime dataDT = DateTime.MinValue;
                        DateTime.TryParse(data, out dataDT);
                        DateTime dataIni = new DateTime(dataDT.Year, dataDT.Month, dataDT.Day, 0, 0, 0);
                        DateTime dataFim = new DateTime(dataDT.Year, dataDT.Month, dataDT.Day, 23, 59, 59);
                        consulta = consulta.Where(x => x.dataBD >= dataIni && x.dataBD <= dataFim);
                    }
                    consulta = consulta.OrderBy(x => x.nome);
                    var retorno = consulta.ToList();

                    foreach (var item in retorno)
                    {
                        item.data = item.dataBD.ToString("yyyy-MM-dd");
                    }

                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.consultaComSucesso));

                    return retorno;
                }
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return default(List<ChamadaChamada>);
            }
        }
        #endregion
    }
}
